package ru.xeden.core.query;

import java.util.Collections;
import java.util.HashMap;
import java.util.Map;

import ru.xeden.core.common.TypeConvert;

/**
 * Класс содержащий базоваые настройки для выполнения запроса к базе
 * @author evga
 *
 */
public class QueryParam
{
    public static final QueryParam DEFAULT;
    public static final Integer DEFAULT_PAGE_SIZE = new Integer("10");
    public static final Integer DEFAULT_PAGE = new Integer("0");
    
    public static final String KEY_PAGE = "page";
    public static final String KEY_PAGE_SIZE = "pageSize";
    public static final String KEY_ORD = "ord";
    public static final String KEY_ASC = "asc";
    
    private Map<String, Object> params;
    
    static
    {
        DEFAULT = new QueryParam();
        DEFAULT.setPage(DEFAULT_PAGE);
        DEFAULT.setPageSize(DEFAULT_PAGE_SIZE);
    }
    
    public QueryParam()
    {
        params = new HashMap<String, Object>();
    }
    
    public void copyFrom(Map<String, ?> map)
    {
        params.putAll(map);
    }
    
    public Map<String, Object> getParamMap()
    {
        return Collections.unmodifiableMap(params);
    }
    
    /**
     * @return номер страницы
     */
    public Integer getPage()
    {
        return getInt(KEY_PAGE, DEFAULT_PAGE);
    }

    /**
     * Устанавливает номер страницы
     * @param page
     */
    public void setPage(Integer page)
    {
        putValue(KEY_PAGE, page);
    }

    /**
     * @return Поле для сортировки
     */
    public String getOrd()
    {
        return getString(KEY_ORD, null);
    }

    /**
     * Устанавливает поле для сортировки
     * @param ord
     */
    public void setOrd(String ord)
    {
        putValue(KEY_ORD, ord);
    }

    /**
     * @return true если сортировка по возрастанию
     */
    public Boolean getAsc()
    {
        return getBool(KEY_ASC, Boolean.TRUE);
    }

    /**
     * Устанавливает направление сортировки
     * @param asc
     */
    public void setAsc(Boolean asc)
    {
        putValue(KEY_ASC, asc);
    }

    /**
     * 
     * @return Размер страницы
     */
    public Integer getPageSize()
    {
        return getInt(KEY_PAGE_SIZE, DEFAULT_PAGE_SIZE);
    }

    @Override
    public int hashCode()
    {
        params.hashCode();
        return super.hashCode();
    }
    
    /**
     * Устанавливает размер страницы
     * @param pageSize
     */
    public void setPageSize(Integer pageSize)
    {
        putValue(KEY_PAGE_SIZE, pageSize);
    }
    
    public void putValue(String key, Object value)
    {
        params.put(key, value);
    }
    
    protected String getString(String key, String defaultValue)
    {
        Object value = params.get(key);
        return TypeConvert.toString(value, defaultValue);
    }

    protected Integer getInt(String key, Integer defaultValue)
    {
        Object value = params.get(key);
        return TypeConvert.toInt(value, defaultValue);
    }

    protected Long getLong(String key, Long defaultValue)
    {
        Object value = params.get(key);
        return TypeConvert.toLong(value, defaultValue);
    }

    protected Boolean getBool(String key, Boolean defaultValue)
    {
        Object value = params.get(key);
        return TypeConvert.toBool(value, defaultValue);
    }
}
